package com.monkarapps.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;
import org.primefaces.model.UploadedFile;

import com.monkarapps.bean.General;
import com.monkarapps.bean.Opcion;
import com.monkarapps.bean.Rol;
import com.monkarapps.bean.Usuario;
import com.monkarapps.constants.Constants;
import com.monkarapps.service.UsuarioImplementacion;


@ManagedBean
@SessionScoped
public class UsuarioBB implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	
	private UploadedFile file;
	private Usuario usuario;
	private Usuario usuario1;
	private List<Rol> roles;
	private Rol rol;
	String rolActual="gen";
	
	ExternalContext G = FacesContext.getCurrentInstance().getExternalContext();
	HttpSession session = 
		(HttpSession) G.getSession(true);
	
	private UsuarioImplementacion usuarioImp;
	
	 private List<General> listaOpcionesSesion = new ArrayList<General>();
	private MenuModel menuOpcionesSesion = new DefaultMenuModel();
	
	public UsuarioBB(){
		usuarioImp = new UsuarioImplementacion();
		usuario = new Usuario();
		usuario1= new Usuario();
		rol= new Rol();
		
		
		
		try {
			roles= usuarioImp.obtenerRoles();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
//	METODO DE ACCESO
	 public void login(ActionEvent actionEvent) throws Exception {  
		 try {
			 System.out.println("entro al metodo login");
			  RequestContext context = RequestContext.getCurrentInstance();  
		        FacesMessage msg = null;  
		        boolean loggedIn = false;  
		        Usuario user = new Usuario();
		        user = usuarioImp.obtenerUsuarioXUsuario(usuario);
		        boolean login = true;
		        if(user != null){
		        	session.setAttribute("UsuarioSesion", user);
		        	loggedIn = true;  
		            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bienvenido ", user.getNombre()); 
		        }else{
		        	loggedIn = false;  
		            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "Credenciales inválidas");
		        }
//		        
		        FacesContext.getCurrentInstance().addMessage(null, msg);  
		        context.addCallbackParam("loggedIn", loggedIn); 
		        
		        rolActual= user.getRol().getNombre();
		        
		        crearMenuSesion();
		} catch (Exception e) {
			e.printStackTrace();
		}
	      
	    }

	 
//	 CERRAR SESION
	 public void logout(ActionEvent actionEvent) {  
		 	System.out.println("entro a cerrar session");
		 	session.setAttribute("UsuarioSesion", null);
		 	menuOpcionesSesion = new DefaultMenuModel();
	        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Bye :(", "Sesion Cerrada."));  
	    } 


	 private void crearMenuSesion(){
		 System.out.println("entro a crear menu Sesion");
		 listaOpcionesSesion = listarOpcionesSesion();
		    for(General g:listaOpcionesSesion){
		    	System.out.println("UNA OPCION");
		    	MenuItem item = new MenuItem();  
		        item.setValue(g.getValor1());  
		        
		        ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
		        MethodExpression methodExpression = 
		        		factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), 
		        				"#{aplicacionBB."+g.getValor2()+"}", String.class, new Class[]{});
//		        MethodExpressionActionListener actionListener = new MethodExpressionActionListener(methodExpression);
//		        item.addActionListener(actionListener);
		        item.setActionExpression(methodExpression);
		        item.setUpdate(":frm_center_center,:growl");
		    	
		        menuOpcionesSesion.addMenuItem(item);
		    }
		   
		 } 
	 
	 private List<General> listarOpcionesSesion(){
		 System.out.println("LISTAR OPCIONES SESION");
	       List<General> list = new ArrayList<General>();
			try {
				Usuario u = (Usuario)session.getAttribute("UsuarioSesion");
				System.out.println("USUARIO ES :"+u.getUsuario());
				for(Opcion o:u.getRol().getOpcions()){
					General c1 = new General();
					c1.setValor1(o.getNombre());
					c1.setValor2(o.getAccion());
					
					list.add(c1);
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	       return list;
		 }
	 
	 public void agregarUsuario(){
//			System.out.println("1");
			
			usuario1.setRol(rol);
//			System.out.println("2");
			FacesMessage msg = null;  
			
			try {
				if (usuarioImp.obtenerUsuarioXUsuarioValidate(usuario1)==null){
//				System.out.println("3");
				usuarioImp.GrabaPersona(usuario1);
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario Agregado ","Nuevo Usuario: "+ usuario1.getNombre()); 
				}else{
					msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Usuario Invalido", "El usuario ya existe");
					
				} 
					
//				System.out.println("4");
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			FacesContext.getCurrentInstance().addMessage(null, msg); 
			
		}
	 

	 
	 
	
	 public void handleFileUpload(FileUploadEvent event) {  
		 
//		 	System.out.println("dentro de FileUploadEvent");
	        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
	        FacesContext.getCurrentInstance().addMessage(null, msg);  
	    }  

	public Usuario getUsuario() {
		return usuario;
	}



	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuario1() {
		return usuario1;
	}

	public void setUsuario1(Usuario usuario1) {
		this.usuario1 = usuario1;
	}

	public List<Rol> getRoles() {
		return roles;
	}

	public void setRoles(List<Rol> roles) {
		this.roles = roles;
	}

	public Rol getRol() {
		return rol;
	}

	public void setRol(Rol rol) {
		this.rol = rol;
	}

	public UploadedFile getFile() {
		return file;
	}

	public void setFile(UploadedFile file) {
		this.file = file;
	}

	public String getRolActual() {
		return rolActual;
	}

	public void setRolActual(String rolActual) {
		this.rolActual = rolActual;
	}

	public List<General> getListaOpcionesSesion() {
		return listaOpcionesSesion;
	}

	public void setListaOpcionesSesion(List<General> listaOpcionesSesion) {
		this.listaOpcionesSesion = listaOpcionesSesion;
	}

	public MenuModel getMenuOpcionesSesion() {
		return menuOpcionesSesion;
	}

	public void setMenuOpcionesSesion(MenuModel menuOpcionesSesion) {
		this.menuOpcionesSesion = menuOpcionesSesion;
	}  

	
	 
	 
	 
}
